
%  adsid.m
%            16 March 1999
% Adaptive System Identification

clear, 
figure(1), clf

% Input signal x(t)

f = 0.8 ;      %  Hz
ts = 0.005 ; % 5 msec -- sampling time
N1 = 800 ; N2 = 400 ; N = N1 + N2 ;

t1 = (0:N1-1)*ts ;  % 0 to 4 sec
t2 = (N1:N-1)*ts ;  % 4 to 6 sec
t = [t1 t2] ;       % 0 to 6 sec

xt = sin(3*t.*sin(2*pi*f*t)) ;
% figure(1)
% plot(t, xt), grid, title('Input Signal, x(t)'), xlabel('time sec')

p = 3 ; % Dimensionality of the system

b1 = [ 1  -0.6 0.4] ; % unknown system paremeters during  t1
b2 = [0.9 -0.5 0.7] ; % unknown system psremeters during  t2

 [d1, stt] = filter(b1, 1, xt(1:N1) ) ;
 d2 =  filter(b2, 1, xt(N1+1:N), stt) ;
 dd = [d1 d2] ; %  output signal

% formation of the input matrix X of size  p by N

X = convmtx(xt, p) ; X = X(:, 1:N) ;

% Alternatively, we could calculated D as

d = [b1*X(:,1:N1) b2*X(:,N1+1:N)] ;
% plot(t, d-dd), grid,

% plot(t, d), grid, title('Output Signal from the System, d(n)'), ... 
% xlabel('time sec')

 y  = zeros(size(d)) ;   % memory allocation for y
eps = zeros(size(d)) ;   % memory allocation for eps

eta = 0.2  ; % learning rate/gain
w = 2*(rand(1, p)  -0.5) ; % Initialisation of the weight vector

for n = 1:N  %  learning loop

 y(n) = w*X(:,n) ;      % predicted output signal
 eps(n) = d(n) - y(n) ; % error signal
 w = w + eta*eps(n)*X(:,n)' ;
 if n == N1-1, w1 = w ; end
end

figure(1)

subplot(2,1,1)
plot(t, xt), grid, title('Input Signal, x(t)'), xlabel('time sec')
subplot(2,1,2)
plot(t, d, 'b', t, y, '-r'), grid, ... 
title('target and predicted signals'), xlabel('time [sec]')
drawnow
%  print -f1 -deps adsid2

figure(2)
plot(t, eps), grid, title(['prediction error for eta = ', num2str(eta)]), ... 
xlabel('time [sec]')
drawnow
%  print -f2 -deps adsid3

[b1; w1]
[b2;  w]
